#include"Acceptor.hh"
#include"TcpConnection.hh"
#include<sys/socket.h>
#include<sys/epoll.h>
#include<vector>
#include<map>
#include<mutex>
class Eventpool
{
public:

    using func = function<void()>;
    using Tcpconptr=shared_ptr<TcpConnection>;
    using func_call=function<void(const Tcpconptr&)>;

    explicit Eventpool(Acceptor& rhs);
    ~Eventpool();

    int createepfd();
    int createvfd();
    void wakup();

    void loop();

    void wait();

    void unloop();

    void handleNewmsg(int fd);
    void handleNewconnect();
    void handleread();

    void dodtask();

    void runInLoop(func &&rhs);

    void add_epoll(int fd);
    void del_epoll(int fd);

    void SetCloseCallback(func_call&& rhs);
    void SetNewconnCallback(func_call&& rhs);
    void SetNewMsgCallback(func_call&& rhs);
    
private:
    int _epfd;
    bool _isloop;
    int _evfd;
    std::vector<func> _task;
    std::mutex _mut;
    func_call _onMsg;
    func_call _onClose;
    func_call _onNewcon;
    Acceptor& _acceptor;
    std::vector<struct epoll_event > _list; 
    std::map<int ,Tcpconptr> _tcp; 

};
